package models; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.ArrayList; import java.util.Hashtable; import java.util.Iterator; import java.util.Map.Entry; import java.util.Observable; import java.util.Observer; import java.util.Random; public class Bank implements BankProc, Serializable, Observer { Random randomGenerator = new Random(); private ArrayList<Person> persons; private ArrayList<Account> accounts; private Hashtable<Person, ArrayList<Account>> hashtable; private String observerReport; public Bank() { persons = new ArrayList<Person>(); accounts = new ArrayList<Account>(); hashtable = new Hashtable<Person, ArrayList<Account>>(); } @Override public void addPerson(Person p) { assert isWellFormed(); assert p != null; int size = persons.size(); persons.add(p); hashtable.put(p, new ArrayList<Account>()); serialize(); assert persons.size() == persons.size() + 1; assert isWellFormed(); } @Override public void removePerson(Person p) { assert isWellFormed(); assert p != null; assert hashtable.containsKey(p); int size = hashtable.size(); persons.remove(p); hashtable.remove(p, hashtable.get(p)); assert !hashtable.containsKey(p); assert hashtable.size() == size - 1; assert isWellFormed(); } @Override public Account addHolderAccounts(Person p, String type, String pin) { Account account = null; assert isWellFormed(); assert p != null; assert type != null; assert pin != null; int size = accounts.size(); if (type.equals("spendings")) { SpendingsAccount spendingsAccount = new SpendingsAccount(randomGenerator.nextInt(100), p.getFirstName(), p.getLastName(), pin, 0); account = spendingsAccount; accounts.add(spendingsAccount); hashtable.get(p).add(account); } else if (type.equals("savings")) { SavingsAccount savingsAccount = new SavingsAccount(randomGenerator.nextInt(100), p.getFirstName(), p.getLastName(), pin, 0); account = savingsAccount; accounts.add(savingsAccount); hashtable.get(p).add(account); } assert accounts.size() == size + 1; assert isWellFormed(); return account; } @Override public void removeHolderAccounts(Person p, Account a) { assert isWellFormed(); assert p != null; assert a != null; int size = accounts.size(); hashtable.get(p).remove(a); accounts.remove(a); assert accounts.size() == size - 1; assert isWellFormed(); } @Override public void readAccountsData(Person p, Account a) { assert isWellFormed(); assert p != null; assert a != null; if (p != null && a != null) { for (Iterator<Account> iterator = hashtable.get(p).iterator(); iterator.hasNext();) { Account value = iterator.next(); if (value.getID() == a.getID()) { System.out.println(value.getID() + " " + value.getTotal()); } } } else { System.out.println("Account or person does not exist"); } assert isWellFormed(); } @Override public void writeAccountsData(Person p, Account a, int data) { assert isWellFormed(); assert p != null; assert a != null; assert data != 0; int total = a.getTotal(); for (Iterator<Account> iterator = hashtable.get(p).iterator(); iterator.hasNext();) { Account value = iterator.next(); if (value.getID() == a.getID()) { value.deposit(data); } } assert a.getTotal() != total; assert isWellFormed(); } @Override public void generateReport() { String data = null; for (Account account : accounts) { data = account.getID() + " " + account.getTotal() + "\n"; System.out.println(data); } } public ArrayList<Account> getAccounts() { return accounts; } public ArrayList<Person> getClients() { return persons; } public Hashtable<Person, ArrayList<Account>> getHashtable() { return hashtable; } private boolean isWellFormed() { for (Entry<Person, ArrayList<Account>> entry : hashtable.entrySet()) { if (entry.getValue().isEmpty()) { return false; } } return true; } public void serialize() { try { FileOutputStream fileOut = new FileOutputStream("bank.ser"); ObjectOutputStream out = new ObjectOutputStream(fileOut); out.writeObject(this); out.close(); fileOut.close(); } catch (IOException i) { i.printStackTrace(); } } public Bank deserialize() { Bank bank = null; try { FileInputStream fileIn = new FileInputStream("bank.ser"); ObjectInputStream in = new ObjectInputStream(fileIn); bank = (Bank) in.readObject(); in.close(); fileIn.close(); } catch (IOException i) { i.printStackTrace(); } catch (ClassNotFoundException c) { c.printStackTrace(); } return bank; } @Override public void update(Observable o, Object arg) { observerReport = "\n" + "A modification has occured at: " + ((Account) o).getID() + "\n" + "Owner: " + ((Account) o).getOwnerFirstName() + " " + ((Account) o).getOwnerLastName() + "\n" + "New total: " + ((Account) o).getTotal(); serialize(); } public String getObserverReport() { return observerReport; } }